/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import Utilidades.ExibirMensagens;
import Utilidades.VariaveisEstaticas;
import dominio.Endereco;
import dominio.Funcionario;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import negocio.ManterEnderecoNegocio;
import negocio.ManterFuncionarioNegocio;

/**
 *
 * @author Gutto
 */
@ManagedBean
@SessionScoped
public class ManterFuncionarioBean {

    private ManterFuncionarioNegocio manterFuncionarioNegocio;
    private Funcionario funcionario;
    private List<Funcionario> funcionarios;
    private boolean exibeTabela;
    private boolean naoSelecionouFuncionario = true;
    private Date data;
    private String salario;
    private Endereco endereco;
    private ManterEnderecoNegocio manterEnderecoNegocio;

    public ManterFuncionarioBean() {
        inicializarAtributos();
    }

    /**
     * Método que inicializa todos os atributos do ManterFuncionarioBean
     */
    private void inicializarAtributos() {
        manterFuncionarioNegocio = new ManterFuncionarioNegocio();
        funcionario = new Funcionario();
        funcionarios = new ArrayList<Funcionario>();
        exibeTabela = false;
        salario = "";
        data = null;
        endereco = new Endereco();
        manterEnderecoNegocio = new ManterEnderecoNegocio();
    }

    /**
     * Método que irá chamar o método create() da classe ManterFuncionarioNegócio.
     *
     */
    public void create() throws ParseException {
        //DateFormat geraData = new SimpleDateFormat();
        //String data2 = (String)data;
        //Date auxData = geraData.parse(data2);
        int resEndereco = manterEnderecoNegocio.create(endereco);
        if (resEndereco == VariaveisEstaticas.SUCESSO) {
            funcionario.setEndereco(endereco);
            funcionario.setSalario(Double.parseDouble(salario));
            funcionario.setDataNascimento(data);
            /** Variável usada para receber o retorno do método create() da classe manterFuncionarioNegocio.<br>
             * Esse retorno é usado para saber se o funcionario foi armazenado ou não, distinguindo assim os possíveis erros.
             */
            int res = manterFuncionarioNegocio.create(funcionario);
            /** switch usado para mostrar a mensagem de inserção ao usário de acordo com o valor da
             * variável res.
             */
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(2), new Integer(0)});
                    inicializarAtributos();
                    break;
                case VariaveisEstaticas.ERRO_DUPLICACAO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(3), new Integer(2), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        } else {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }

    /**
     * Método que irá chamar o edit da classe manterFuncionarioNegocio. É usado para editar um funcionario.
     *
     */
    public void edit() throws ParseException {

        Endereco endOld = new Endereco();
        endOld = manterFuncionarioNegocio.findFuncionario(funcionario).getEndereco();
        int resEndereco = manterEnderecoNegocio.edit(endereco);

        if (resEndereco == VariaveisEstaticas.SUCESSO) {

            funcionario.setEndereco(endereco);

            funcionario.setSalario(Double.parseDouble(salario));
            funcionario.setDataNascimento(data);

            int res = manterFuncionarioNegocio.edit(funcionario);
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(2), new Integer(1)});

                    naoSelecionouFuncionario = true;   // Caso ele consiga excluir o funcionario, então essa variável irá receber true para desabilitar o botão.
                    //produto = new Produto();
                    inicializarAtributos();
                    break;

                case VariaveisEstaticas.ERRO_DUPLICACAO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(3), new Integer(2), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        } else {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }

    /**
     * Método que irá chamar o destroy() da classe manterFuncionarioNegocio, será chamado para excluir um funcionario.
     *
     */
    public void destroy() {
        int resEndereco = manterEnderecoNegocio.destroy(endereco);
        if (resEndereco == VariaveisEstaticas.SUCESSO) {
            int res = manterFuncionarioNegocio.destroy(funcionario);
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(2), new Integer(2)});

                    naoSelecionouFuncionario = true;   // Caso ele consiga excluir o funcionario, então essa variável irá receber true para desabilitar o botão.
                    inicializarAtributos();
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        } else {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }
    /*
     * Obtem a lista de funcionários no BD.
     */

    public void findFuncionarioEntities() {
        exibeTabela = true;

        funcionarios = manterFuncionarioNegocio.findFuncionarioEntities();

    }
    /*
     * Método para formatar a data que está no banco de dados para um formato compatível com o campo de texto em que será exibida.
     */

    public void formataData() throws ParseException {
        SimpleDateFormat dataAux = new SimpleDateFormat("dd/MM/yyyy");
        String data2 = dataAux.format(data);
        data = dataAux.parse(data2);
    }

    public boolean isExibeTabela() {
        return exibeTabela;
    }

    public void setExibeTabela(boolean exibeTabela) {
        this.exibeTabela = exibeTabela;
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public List<Funcionario> getFuncionarios() {
        return funcionarios;
    }

    public void setFuncionarios(List<Funcionario> funcionarios) {
        this.funcionarios = funcionarios;
    }

    public ManterFuncionarioNegocio getManterFuncionarioNegocio() {
        return manterFuncionarioNegocio;
    }

    public void setManterFuncionarioNegocio(ManterFuncionarioNegocio manterFuncionarioNegocio) {
        this.manterFuncionarioNegocio = manterFuncionarioNegocio;
    }

    public boolean isNaoSelecionouFuncionario() {
        return naoSelecionouFuncionario;
    }

    public void setNaoSelecionouFuncionario(boolean naoSelecionouFuncionario) {
        this.naoSelecionouFuncionario = naoSelecionouFuncionario;
    }

    public String getSalario() {
        return salario;
    }

    public void setSalario(String salario) {
        this.salario = salario;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
}
